home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 352_01 / veccorlt.cpp < prev    next >
C/C++ Source or Header  |  1991-04-22  |  2KB  |  104 lines

  1. // VECCORLT.CPP
  2. //    this routine computes the correlation function between 2 real Vectors
  3. //
  4. //    where:
  5. //       Vector x, y  = Vector of real (float) data
  6. //       float *r    = r-value
  7. //       float *t = t-value
  8. //
  9. //    RETURNS: void. sets *r, *t to r & t values for correlation.
  10. //
  11. //
  12. //    NOTES:
  13. //     This routine computes correlation using linear programming methods
  14. //    for one-dimensional datasets. No provision is made for singular data
  15. //
  16. //    uses
  17. // r = SUM{ x-xbar)*(y-ybar) }/ sqrt( SUM{ (x-xbar)**2 }*SUM{ (y-ybar)**2 } )
  18. //
  19. //    replacing:
  20. //    SUM{ (x-xbar)**2 }       = SUM{x**2} - ( SUM{x}**2 /n )
  21. //    SUM{ (x-xbar)*(y-ybar) } = SUM{x*y}  - ( SUM{x}*SUM{y}/n )
  22. //
  23. // t = r * sqrt( (n-2)/(1-r**2) )
  24. //
  25. // df = n-2
  26. //
  27.  
  28. #include <stdlib.h>
  29. #include <math.h>
  30.  
  31. #include "wtwg.h"
  32. #include "dblib.h"
  33. #include "vector.h"
  34.  
  35. void correlate ( Vector& x, Vector& y, float *r, float *t )
  36.     {
  37.     float sumx, sumy, sumsqx, sumsqy, sumxy;
  38.     float xval, yval;
  39.     float nf;
  40.     float rval;
  41.     float denom;        // denominator - prevent zero divide.
  42.  
  43.     int ndata = min ( x.n, y.n );
  44.  
  45.     float  *yv = y.v,  *xv = x.v;         // pointers to data.
  46.  
  47.     sumx = sumy = sumsqx = sumsqy = sumxy =0;
  48.     
  49.     *r = *t = 0;
  50.     if ( ndata <= 2 ) return; 
  51.     
  52.  
  53.     for (int i =0; i<ndata; ++i )
  54.         {
  55.         xval = xv[i];
  56.         yval = yv[i];
  57.  
  58.         sumx += xval;
  59.         sumy += yval;
  60.  
  61.         sumsqx += xval*xval;
  62.         sumsqy += yval*yval;
  63.  
  64.         sumxy  += xval*yval;
  65.         }
  66.  
  67.  
  68.     if ( sumsqx < SMALL_VAL || sumsqy < SMALL_VAL )
  69.         {
  70.         /* one of the datasets consistantly equals its mean
  71.          */
  72.         return;
  73.         }
  74.  
  75.     nf = ((float) ndata);
  76.  
  77.     denom = (sumsqx - (sumx*sumx/nf)) * (sumsqy - (sumy*sumy/nf));
  78.     
  79.     if ( denom > SMALL_VAL )
  80.         {
  81.         rval = (sumxy - sumx*sumy/nf) /  sqrt (denom);
  82.         }
  83.     else
  84.         {
  85.         rval = LARGE_VAL;    // prevent zero divide.    (should never happen)
  86.         }
  87.         
  88.     *r = rval;
  89.  
  90.     denom = (  1.0 -(rval*rval) );
  91.     if ( denom > SMALL_VAL )
  92.         {
  93.         *t = rval * sqrt( (nf- 2.0) / ( denom ) ) ;
  94.         }
  95.     else
  96.         {
  97.         *t = LARGE_VAL;
  98.         }
  99.  
  100.  
  101.  
  102.     return;    /* VECTOR_correlate */
  103.     }
  104.